package com.herench.bs.transfer;

import org.apache.cxf.endpoint.Client;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.HashMap;
import java.util.Map;

/**
 * 提取患者基本信息：GetPatient()
 *
 * @author liuxiaohui
 * @date 2019/3/26
 */
public class GetPatientInHosTransfer extends AbstractTransfer {
    public GetPatientInHosTransfer(String method, Client client, String messageMethod) {
        super(method, client, messageMethod);
    }

    /**
     * 发送：微信前端JSON数据转换为HIS用的XML数据（微信前端==》HIS）
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public String toInvokeMessage(Map<String, Object> params) throws Exception {
        // 身份证号码
        String idNo = (String) params.get("idNo");
        // 门诊住院标志（0:门诊、1:住院、默认：0）
        String outpOrInp = (String) params.get("outpOrInp");
        // 交易ID：his的方法名
        Document document = getTplDoc(getMethod());

        // 将各个参数设值（入参的树状结构：父==》子）
        Element dataRow = document.getRootElement().element("CommitData").addElement("Data").addElement("DataRow");
        // 查询类别（1:patient_id、2:name|sex、3:id_no（身份证号）、4:(card_type|card_no)证件类别编码|证件号）
        dataRow.addAttribute("QUERY_TYPE", "3");
        // 查询条件
        dataRow.addAttribute("QUERY_CONJ", idNo);
        // 门诊住院标志（0:门诊、1:住院、默认：0）
        dataRow.addAttribute("OUTP_OR_INP", outpOrInp);

        return document.asXML();
    }

    /**
     * 接收：HIS返回的XML数据并转换为JSON（HIS==》微信前端）
     * @param resMsg
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> toResultMessage(String resMsg) throws Exception {
        Map<String, Object> resMap = new HashMap<>(16);
        Document document = DocumentHelper.parseText(resMsg);

        Element resultInfo = document.getRootElement().element("Result").element("Info");
        String executeStatus = resultInfo.attributeValue("EXECUTE_STATUS");
        String executeMessage = resultInfo.attributeValue("EXECUTE_MESSAGE");

        if (Dialect.getSuccessfulState().equals(executeStatus)) {
            // 获取各个参数的值（出参的树状结构：父==》子）
            Element dataRow = document.getRootElement().element("ReturnData").element("Patient").element("DataRow");
            if (dataRow == null) {
                resMap.put("code", "1403");
                resMap.put("message", "调用成功，但是获取的数据为 0 件！");
            } else {
                GetPatientInHosInnerMessage innerMessage = new GetPatientInHosInnerMessage(dataRow);

                // 患者ID
                resMap.put("patientId", innerMessage.getPatientId());
                // 住院号
                resMap.put("inpNo", innerMessage.getInpNo());
                // 证件类型代码
                resMap.put("credentialsType", innerMessage.getCredentialsType());
                // 证件号
                resMap.put("credentialsNo", innerMessage.getCredentialsNo());
                // 姓名
                resMap.put("name", innerMessage.getName());
                // 年龄
                resMap.put("age", innerMessage.getAge());
                // 出生日期
                resMap.put("birthday", innerMessage.getBirthday());
                // 性别，中文（男、女、未知）
                resMap.put("sex", innerMessage.getSex());
                // 户口住址
                resMap.put("address", innerMessage.getAddress());
                // 现住址
                resMap.put("currentAddress", innerMessage.getCurrentAddress());
                // 国籍
                resMap.put("citizenship", innerMessage.getCitizenship());
                // 民族，中文（汉族，回族等）
                resMap.put("nation", innerMessage.getNation());
                // 籍贯
                resMap.put("nativePlace", innerMessage.getNativePlace());
                // 出生地，代码
                resMap.put("birthPlace", innerMessage.getBirthPlace());
                // 邮政编码
                resMap.put("zipCode", innerMessage.getZipCode());
                // 手机号码
                resMap.put("phoneNumberHome", innerMessage.getPhoneNumberHome());
                // 身份，中文
                resMap.put("identity", innerMessage.getIdentity());
                // 费别，中文
                resMap.put("chargeType", innerMessage.getChargeType());
                // 婚姻状况，代码
                resMap.put("maritalStatus", innerMessage.getMaritalStatus());
                // 门诊绑定状态
                resMap.put("patBind", innerMessage.getPatBind());
                // 身份证号
                resMap.put("idNo", innerMessage.getIdNo());
                // 医保卡号
                resMap.put("insurCardNo", innerMessage.getInsurCardNo());
                // 工作单位
                resMap.put("serviceAgency", innerMessage.getServiceAgency());
                // 联系人姓名
                resMap.put("nextOfKin", innerMessage.getNextOfKin());
                // 与联系人关系
                resMap.put("relationship", innerMessage.getRelationship());
                // 联系人电话
                resMap.put("nextOfKinPhone", innerMessage.getNextOfKinPhone());
                // 联系人地址
                resMap.put("nextOfKinAddr", innerMessage.getNextOfKinAddr());
                // 联系人邮政编码"
                resMap.put("nextOfKinZipCode", innerMessage.getNextOfKinZipCode());
                // 是否住院：1:住院状态;0:非住院状态
                resMap.put("isInhos", innerMessage.getIsInhos());

                // 返回Code
                resMap.put("code", executeStatus);
                // 返回信息
                resMap.put("message", "成功！");
            }
        } else {
            resMap.put("code", executeStatus);
            resMap.put("message", executeMessage);
        }
        return resMap;
    }

    public class GetPatientInHosInnerMessage implements InnerMessage{
        /**
         * 患者ID
         */
        private String patientId;
        /**
         * 住院号
         */
        private String inpNo;
        /**
         * 证件类型代码
         */
        private String credentialsType;
        /**
         * 证件号
         */
        private String credentialsNo;
        /**
         * 姓名
         */
        private String name;
        /**
         * 年龄
         */
        private String age;
        /**
         * 出生日期
         */
        private String birthday;
        /**
         * 性别，中文（男、女、未知）
         */
        private String sex;
        /**
         * 户口住址
         */
        private String address;
        /**
         * 现住址
         */
        private String currentAddress;
        /**
         * 国籍
         */
        private String citizenship;
        /**
         * 民族，中文（汉族，回族等）
         */
        private String nation;
        /**
         * 籍贯
         */
        private String nativePlace;
        /**
         * 出生地，代码
         */
        private String birthPlace;
        /**
         * 邮政编码
         */
        private String zipCode;
        /**
         * 手机号码
         */
        private String phoneNumberHome;
        /**
         * 身份，中文
         */
        private String identity;
        /**
         * 费别，中文
         */
        private String chargeType;
        /**
         * 婚姻状况，代码
         */
        private String maritalStatus;
        /**
         * 门诊绑定状态
         */
        private String patBind;
        /**
         * 身份证号
         */
        private String idNo;
        /**
         * 医保卡号
         */
        private String insurCardNo;
        /**
         * 工作单位
         */
        private String serviceAgency;
        /**
         * 联系人姓名
         */
        private String nextOfKin;
        /**
         * 与联系人关系
         */
        private String relationship;
        /**
         * 联系人电话
         */
        private String nextOfKinPhone;
        /**
         * 联系人地址
         */
        private String nextOfKinAddr;
        /**
         * 联系人邮政编码"
         */
        private String nextOfKinZipCode;
        /**
         * 是否住院
         */
        private String isInhos;



        public GetPatientInHosInnerMessage(Element element) {
            // 患者ID
            this.patientId = element.attributeValue("PATIENT_ID");
            // 住院号
            this.inpNo = element.attributeValue("INP_NO");
            // 证件类型代码
            this.credentialsType = element.attributeValue("CREDENTIALS_TYPE");
            // 证件号
            this.credentialsNo = element.attributeValue("CREDENTIALS_NO");
            // 姓名
            this.name = element.attributeValue("NAME");
            // 年龄
            this.age = element.attributeValue("AGE");
            // 出生日期
            this.birthday = element.attributeValue("BIRTHDAY");
            // 性别，中文（男、女、未知）
            this.sex = element.attributeValue("SEX");
            // 户口住址
            this.address = element.attributeValue("ADDRESS");
            // 现住址
            this.currentAddress = element.attributeValue("CURRENT_ADDRESS");
            // 国籍
            this.citizenship = element.attributeValue("CITIZENSHIP");
            // 民族，中文（汉族，回族等）
            this.nation = element.attributeValue("NATION");
            // 籍贯
            this.nativePlace = element.attributeValue("NATIVE_PLACE");
            // 出生地，代码
            this.birthPlace = element.attributeValue("BIRTH_PLACE");
            // 邮政编码
            this.zipCode = element.attributeValue("ZIP_CODE");
            // 手机号码
            this.phoneNumberHome = element.attributeValue("PHONE_NUMBER_HOME");
            // 身份，中文
            this.identity = element.attributeValue("IDENTITY");
            // 费别，中文
            this.chargeType = element.attributeValue("CHARGE_TYPE");
            // 婚姻状况，代码
            this.maritalStatus = element.attributeValue("MARITAL_STATUS");
            // 门诊绑定状态
            this.patBind = element.attributeValue("PAT_BIND");
            // 身份证号
            this.idNo = element.attributeValue("ID_NO");
            // 医保卡号
            this.insurCardNo = element.attributeValue("INSUR_CARD_NO");
            // 工作单位
            this.serviceAgency = element.attributeValue("SERVICE_AGENCY");
            // 联系人姓名
            this.nextOfKin = element.attributeValue("NEXT_OF_KIN");
            // 与联系人关系
            this.relationship = element.attributeValue("RELATIONSHIP");
            // 联系人电话
            this.nextOfKinPhone = element.attributeValue("NEXT_OF_KIN_PHONE");
            // 联系人地址
            this.nextOfKinAddr = element.attributeValue("NEXT_OF_KIN_ADDR");
            // 联系人邮政编码
            this.nextOfKinZipCode = element.attributeValue("NEXT_OF_KIN_ZIP_CODE");
            // 是否住院
            this.isInhos = element.attributeValue("IS_INHOS");

        }

        /**
         * 患者ID
         */
        public String getPatientId() {
            return patientId;
        }
        /**
         * 住院号
         */
        public String getInpNo() {
            return inpNo;
        }
        /**
         * 证件类型代码
         */
        public String getCredentialsType() {
            return credentialsType;
        }
        /**
         * 证件号
         */
        public String getCredentialsNo() {
            return credentialsNo;
        }
        /**
         * 姓名
         */
        public String getName() {
            return name;
        }
        /**
         * 年龄
         */
        public String getAge() {
            return age;
        }
        /**
         * 出生日期
         */
        public String getBirthday() {
            return birthday;
        }
        /**
         * 性别，中文（男、女、未知）
         */
        public String getSex() {
            return sex;
        }
        /**
         * 户口住址
         */
        public String getAddress() {
            return address;
        }
        /**
         * 现住址
         */
        public String getCurrentAddress() {
            return currentAddress;
        }
        /**
         * 国籍
         */
        public String getCitizenship() {
            return citizenship;
        }
        /**
         * 民族，中文（汉族，回族等）
         */
        public String getNation() {
            return nation;
        }
        /**
         * 籍贯
         */
        public String getNativePlace() {
            return nativePlace;
        }
        /**
         * 出生地，代码
         */
        public String getBirthPlace() {
            return birthPlace;
        }
        /**
         * 邮政编码
         */
        public String getZipCode() {
            return zipCode;
        }
        /**
         * 手机号码
         */
        public String getPhoneNumberHome() {
            return phoneNumberHome;
        }
        /**
         * 身份，中文
         */
        public String getIdentity() {
            return identity;
        }
        /**
         * 费别，中文
         */
        public String getChargeType() {
            return chargeType;
        }
        /**
         * 婚姻状况，代码
         */
        public String getMaritalStatus() {
            return maritalStatus;
        }
        /**
         * 门诊绑定状态
         */
        public String getPatBind() {
            return patBind;
        }
        /**
         * 身份证号
         */
        public String getIdNo() {
            return idNo;
        }
        /**
         * 医保卡号
         */
        public String getInsurCardNo() {
            return insurCardNo;
        }
        /**
         * 工作单位
         */
        public String getServiceAgency() {
            return serviceAgency;
        }
        /**
         * 联系人姓名
         */
        public String getNextOfKin() {
            return nextOfKin;
        }
        /**
         * 与联系人关系
         */
        public String getRelationship() {
            return relationship;
        }
        /**
         * 联系人电话
         */
        public String getNextOfKinPhone() {
            return nextOfKinPhone;
        }
        /**
         * 联系人地址
         */
        public String getNextOfKinAddr() {
            return nextOfKinAddr;
        }
        /**
         * 联系人邮政编码
         */
        public String getNextOfKinZipCode() {
            return nextOfKinZipCode;
        }
        /**
         * 是否住院
         */
        public String getIsInhos() {
            return isInhos;
        }

    }
}
